package 中等.数学;

/**
 * 二进制数转字符串。给定一个介于0和1之间的实数（如0.72），类型为double，
 * 打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示，
 * 则打印“ERROR”。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/bianry-number-to-string-lcci
 */
public class 二进制数转字符串_0502 {

    public static void main(String[] args) {

        System.out.println(printBin(0.1));

    }

    /**
     * 小数转二进制
     * 十进制的小数转换为二进制，主要是小数部分乘以 2，
     * 取整数部分依次从左往右放在小数点后，直至小数点后为 0
     * 注意：超过 32 位小数，直接返回ERROR
     */
    public static String printBin(double num) {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("0.");

        while (num % 1 > 0) {
            if (stringBuilder.length() > 34) {
                return "ERROR";
            }

            num *= 2;
            if (num >= 1) {
                stringBuilder.append(1);
                num -= 1;
            } else {
                stringBuilder.append(0);
            }
        }

        return stringBuilder.toString();
    }

}
